package com.just521.xinshoutong.encrypt;

import java.io.UnsupportedEncodingException;
import java.security.Provider;
import java.security.SecureRandom;
import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**  
���� �C 
1.String encryptingCode = SimpleCrypto.encrypt(masterPassword,originalText);


���� �C 
1.String originalText = SimpleCrypto.decrypt(masterpassword, encryptingCode);


masterpassword: ���롣
encryptingCode�����ܺ���ַ�
originalText: ��Ҫ���ܵ��ַ�
*/  
public class AES {   
	public final static byte[] localkey = {-112, 73, 52, 118, 18, -97, -84, 78, 89, 98, 3, -57, -124, -122, 84, 3};
	public  static byte[] netkey = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
	static Provider mpdBC=Security.getProvider("BC");
	
	
   public static String encrypt(String plain_text, boolean local ) throws Exception {   
	   byte[] result = null;
	   if(local)
	   {
		   result = encrypt(localkey, plain_text.getBytes("utf-8"));
	   }      
	   else
	   {
		   result = encrypt(netkey, plain_text.getBytes("utf-8"));		   
	   }
	   return  toHex(result);   
   }   
      
   public static String decrypt(String encode_text, boolean local ) throws Exception {   
	   byte[] result=null;
       byte[] enc = toByte(encode_text);   
       try{
    	   if( local )
    	   {
    		   result = decrypt(localkey, enc);
    	   }
    	   else
    	   {
    		   result = decrypt(netkey, enc);
    	   }
    	   
    	   
    	   return new String(result);  
       }catch(Exception e){
    	   return null;
       }
        
   }   
 
   private static byte[] getRawKey(byte[] seed) throws Exception {   
       KeyGenerator kgen = KeyGenerator.getInstance("AES",mpdBC);   
       SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");   
       sr.setSeed(seed);   
       kgen.init(128, sr); // 192 and 256 bits may not be available   
       SecretKey skey = kgen.generateKey();   
       byte[] raw = skey.getEncoded();   
       return raw;   
   }   
 
      
   private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {   
       SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
       
       Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding",mpdBC);  
       
       cipher.init(Cipher.ENCRYPT_MODE, skeySpec);   
       byte[] encrypted = cipher.doFinal(clear);   
       return encrypted;   
   }   
 
   private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {   
       SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");   
       Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding",mpdBC);     
       cipher.init(Cipher.DECRYPT_MODE, skeySpec);   
       byte[] decrypted = cipher.doFinal(encrypted);   
       return decrypted;   
   }   
 
   public static String toHex(String txt) {
	   String strRet = null;
	   try{
		   
		   strRet=toHex(txt.getBytes("utf-8"));   
	   }catch(UnsupportedEncodingException e){
		   
	   }
	   return strRet;
   }   
   public static String fromHex(String hex) {   
       return new String(toByte(hex));   
   }   
      
   public static byte[] toByte(String hexString) {   
       int len = hexString.length()/2;   
       byte[] result = new byte[len];   
       for (int i = 0; i < len; i++)   
           result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();   
       return result;   
   }   
 
   public static String toHex(byte[] buf) {   
       if (buf == null)   
           return "";   
       StringBuffer result = new StringBuffer(2*buf.length);   
       for (int i = 0; i < buf.length; i++) {   
           appendHex(result, buf[i]);   
       }   
       return result.toString();   
   }   
   private final static String HEX = "0123456789ABCDEF";   
   private static void appendHex(StringBuffer sb, byte b) {   
       sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));   
   }   
      
}  
